/**
 * JWT认证是目前最流行的跨域认证解决方案，JWT由三部分组成：Header.Payload(有效荷载，这部分是加密的用户信息).Signature，点号两端的起到保护Payload安全的作用
 * 需要安装jsonwebtoken和express-jwt两个包，jsonwebtoken的作用是将用户信息生成token返回给客户端，express-jwt的作用是将请求头中的token信息转为用户信息
 * 1. 生成jwttoken需要用到jwt.sign方法将信息生成token
 * 2. 解析jwttoken需要注册express-jwt中间件
 */
const express = require('express')
const expressJWT = require('express-jwt')

const config = require('./config/config')
const jwtRouter = require('./Router/jwtRouter')

app = express()

// 注册解析urlencoded数据的中间件
app.use(express.urlencoded({extended: false}))
// 注册解析客户端jwttoken的中间件，注册该中间后，req中就会被绑定一个user属性，有jwttoken解析的路由就可以用req.user方法获取token中的负载信息
// 注意express-jwt的版本问题，unless作用是除了匹配到的路由，其他路由都得用到jwt解析
app.use(expressJWT({ secret: config.secretKey }).unless({path: [/^\/api\//]}))
// 注册路由
app.use(jwtRouter)
// 注册捕获异常的中间件
app.use((err, req, res, next) => {
    // console.log(err)
    // console.log(err.message)
    if(err.name == 'UnauthorizedError') {
        res.send({
            status: 401,
            msg: 'token过期'
        })
    }

    res.send({
        status: 500,
        msg: '未知错误'
    })
    next()
})


app.listen(80, () => {
    console.log('server is running at http://127.0.0.1:80')
})